<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 1 链式继承(通过给构造函数的prototype附上其他构造函数的原型，实现链式继承)
    // Professor.prototype.tSkill = "JAVA";
    // function Professor() { };
    // var professor = new Professor();

    // Teacher.prototype = professor;
    // function Teacher() {
    //   this.mSkill = 'JS/JQ';
    //   this.success = {
    //     alibaba: '28',
    //     tencent: "30"
    //   }
    //   this.num = 0
    // }
    // var teacher = new Teacher();

    // Student.prototype = teacher;
    // function Student() {
    //   this.pShill = "HTML/CSS"
    // }
    // var student = new Student()
    // // success是引用类型，都会改
    // student.success.baidu = '100'
    // // num是数字类型，只会改自己的值
    // student.num = 300
    // console.log(student)
    // console.log(teacher)




    // 2 
    // function Car() {
    //   this.brand = 'Benz'
    // }

    // Car.prototype = {
    //   brand: 'Mazda',
    //   intro: function () {
    //     console.log('我是' + this.brand + 'che')
    //   }
    // }

    // var car = new Car()
    // // this类型转换问题，谁调用，this指向谁
    // car.intro();
    // Car.prototype.intro()




    // 3
    // function Person() {
    //   this.smoke = function () {
    //     this.weight--
    //   }
    // }
    // Person.prototype = {
    //   weight: 130
    // }
    // var person = new Person();
    // console.log(person)
    // person.smoke()
    // // this.weight = this.weight - 1
    // // 第一个weight给自身加一个weight属性。第二个是访问原型的weight
    // console.log(person)



    // // 4 这两种是一样的Object.create()可以指定实例的原型
    // function Obj() { }
    // Obj.prototype.num = 1;
    // var obj1 = Object.create(Obj.prototype)
    // var obj2 = new Obj()
    // console.log(obj1)
    // console.log(obj2)




    // 5 创建空对象
    // var obj1 = Object.create(null)
    // console.log(obj1) 
    // obj1.num = 1;
    // var obj2 = Object.create(obj1) // 把obj1给obj2的_proto_
    // console.log(obj2)
    // console.log(obj2.num)



    // //6 不是所有的对象都继承与Object.prototype
    // var obj = Object.create(null)
    // obj.num = 1
    // // obj.toString() //报错

    // var obj1 = {
    //   count: 2
    // }

    // obj.__proto__ = obj1
    // console.log(obj.count)// undefined 手动赋值__proto__，查询不会走原型链




    //7  Object.create(null)这样产生的空对象不会继承来自Object的方法
    // var obj = Object.create(null)
    // document.write(obj)
    // console.log(obj) // 都是报错，在打印是会默认进行toString(),但并没有继承Object的toString方法





    //8 改变this执行。当一个函数完成后，我们用这个函数进行扩展
    // function Car(brand, color) {
    //   this.brand = brand;
    //   this.color = color;
    //   this.run = function () {
    //     conosle.log('running')
    //   }
    // }

    // var newCar = {
    //   dsiplacement: "3"
    // }


    // Car.apply(newCar, ['Benz', 'red'])
    // console.log(newCar)

    // var car = new Car('Benz', 'red')
    // console.log(car)



    // 9

    // function Func1() {
    //   this.add = function (a, b) {
    //     console.log(a + b)
    //   }
    //   this.minus = function (a, b) {
    //     console.log(a - b)
    //   }
    // }
    // function Func2() {
    //   Func1.apply(this)
    //   this.mul = function (a, b) {
    //     console.log(a * b)
    //   }
    //   this.divide = function (a, b) {
    //     console.log(a / b)
    //   }
    // }
    // var fun2 = new Func2()
    // fun2.add(1, 2)
    // fun2.minus(1, 2)
    // fun2.mul(1, 2)
    // fun2.divide(1, 2)





  </script>
</body>

</html>